import { ElNotification, ElMessageBox } from 'element-plus'

/**
 * 根据传入的type参数，返回不同的提示信息
 * @param type 消息类型
 * @returns
 */
const titleFn = (type: MessageType) => {
  // 定义一个基础提示信息
  const base = '提示！'
  // 使用switch语句，根据type参数的值，返回不同的提示信息
  switch (type) {
    case 'success':
      return `成功${base}`
    case 'warning':
      return `警告${base}`
    case 'info':
      return `信息${base}`
    case 'error':
      return `错误${base}`
    // 如果type参数的值不在上述几种情况中，则返回一个类型断言
    default:
      // eslint-disable-next-line no-case-declarations
      const exhaustiveness: never = type
      return exhaustiveness
  }
}

/**
 * 消息提示
 * @param message 消息内容
 * @param type 消息提示枚举类型，默认为成功消息
 * @param dangerouslyUseHTMLString 是否使用HTML字符串，默认为false
 */
export function msgTip(
  message: string,
  type: MessageType = 'success',
  dangerouslyUseHTMLString = false
) {
  // 使用ElNotification组件显示消息提示
  ElNotification({
    // 标题根据type参数的值来确定
    title: titleFn(type),
    // 消息内容
    message,
    // 消息类型
    type,
    // 是否使用HTML字符串
    dangerouslyUseHTMLString,
    // 消息显示时长
    duration: 3000
  })
}

/**
 * 弹出框提示枚举类型
 */
// export enum MsgBoxEnum {
//   /**
//    * 删除，防止误删。危险操作！
//    */
//   delete = '删除',

//   /**
//    * 退出类型，防止没保存退出。
//    */
//   exit = '退出'
// }

/**
 * 执行回调函数和弹出提示框,根据传入的type参数，弹出不同的确认框
 * @param callback 回调函数，用于在确认后执行
 * @param type
 * @returns
 */
export async function msgBoxTip(
  // 回调函数，用于在确认后执行
  callback: (...args: any[]) => any | null,
  // 默认类型为退出
  type: MessageBoxActionType = 'exit'
) {
  // 弹出确认框，询问是否确定要退出
  return await ElMessageBox.confirm(
    `确定要${type}吗？`,
    `${type == 'exit' ? '系统' : '删除'}提示`,
    {
      // 确定按钮的文本
      confirmButtonText: '确定',
      // 取消按钮的文本
      cancelButtonText: '取消',
      // 居中显示
      // center: true,
      // 是否可拖放
      draggable: true,

      // icon: markRaw(Delete),
      // 提示框的类型为警告
      type: 'warning'
    }
  )
    // 如果用户点击了确定按钮
    .then(() => {
      // 执行回调函数
      callback()
      // 弹出提示框，提示退出完成
      msgTip(`${type}完成！`, 'success')
    })
    // 如果用户点击了取消按钮
    .catch(() => {
      // 弹出提示框，提示退出已取消
      msgTip(`${type}已取消！`, 'info')
    })
}
